package fr.babos.graphic._ 
{
	import flash.text.AntiAliasType;
	import flash.text.StyleSheet;
	import flash.text.TextFormat;
	import fr.babos.utils.ObjectUtils;
	
	/**
	 * ...
	 * @author ZoulouX
	 */
	public class TextSkin 
	{
		/**
		 * Le format du texte
		 */
		protected var _textFormat						:TextFormat;
		
		/**
		 * Le styleSheet du texte
		 */
		protected var _styleSheet						:StyleSheet;
		
		/**
		 * Si le texte doit utiliser les typos embarquées
		 */
		protected var _embedFonts						:Boolean;
		
		/**
		 * Le mode d'antialias du texte
		 */
		protected var _antiAliasType					:String;
		
		
		/**
		 * Le format du texte
		 */
		public function get textFormat ():TextFormat { return _textFormat; }
		
		/**
		 * Le styleSheet du texte
		 */
		public function get styleSheet ():StyleSheet { return _styleSheet; }
		
		/**
		 * Si le texte doit utiliser les typos embarquées
		 */
		public function get embedFonts ():Boolean { return _embedFonts; }
		
		/**
		 * Le mode d'antialias du texte
		 */
		public function get antiAliasType ():String { return _antiAliasType; }
		
		
		/**
		 * Le constructer
		 * @param	pFormat : Le format (objet dynamique, ou objet TextFormat)
		 * @param	pStyle : Le styleSheet (objet dynamique, objet StyleSheet, String, ou noeud XML à un niveau pour écrire sur plusieurs lignes)
		 * @param	pEmbedFont : Si les typos embarquées seront utilisées
		 * @param	pAntiAliasType : Le type d'antialias utilisé pour le rendu
		 */
		public function TextSkin (pFormat:Object = null, pStyle:Object = null, pEmbedFonts:Boolean = false, pAntiAliasType:String = "")
		{
			// Enregistrer format et style
			format(pFormat)
			style(pStyle)
			
			// Enregistrer le rendu du texte
			fontRender(pEmbedFonts, pAntiAliasType);
		}
		
		
		/**
		 * Définir le format du texte
		 * @param	pFormat : Le format (objet dynamique, ou objet TextFormat)
		 */
		public function format (pFormat:Object):TextSkin
		{
			// Si on a un format
			if (pFormat != null)
			{
				// Si notre format est bien un textFormat
				if (pFormat is TextFormat)
				{
					// On cast juste
					_textFormat = pFormat as TextFormat;
				}
				else
				{
					// On extra
					_textFormat = ObjectUtils.extra(new TextFormat(), pFormat) as TextFormat;
				}
			}
			else
			{
				// Celui par défaut
				_textFormat = new TextFormat();
			}
			
			// Méthode chaînable
			return this;
		}
		
		/**
		 * Définir le style du texte
		 * @param	pStyle : Le styleSheet (objet dynamique, objet StyleSheet, String, ou noeud XML à un niveau pour écrire sur plusieurs lignes)
		 */
		public function style (pStyle:Object):TextSkin
		{
			// Si on a un style
			if (pStyle != null)
			{
				// Si notre style est un objet stylesheet
				if (pStyle is StyleSheet)
				{
					// On cast juste
					_styleSheet = pStyle as StyleSheet;
				}
				
				// Si c'est du String ou de l'XML, on parse
				else if (pStyle is String)
				{
					_styleSheet = new StyleSheet();
					_styleSheet.parseCSS(pStyle as String);
				}
				else if (pStyle is XML)
				{
					_styleSheet = new StyleSheet();
					_styleSheet.parseCSS((pStyle as XML).toString());
				}
				else
				{
					_styleSheet = ObjectUtils.extra(new StyleSheet(), pStyle) as StyleSheet;
				}
			}
			
			// Méthode chaînable
			return this;
		}
		
		/**
		 * Définir l'affichage de la font
		 * @param	pEmbedFont : Si les typos embarquées seront utilisées
		 * @param	pAntiAliasType : Le type d'antialias utilisé pour le rendu
		 */
		public function fontRender (pEmbedFont:Boolean, pAntiAliasType:String):TextSkin
		{
			// Appliquer sur le texteField
			_embedFonts = pEmbedFont;
			_antiAliasType = pAntiAliasType;
			
			// Méthode chaînable
			return this;
		}
	}
}